home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / C / Games / Pentominoes 2.0 / Pent code / pent load-save.c < prev    next >
Text File  |  1995-07-29  |  8KB  |  111 lines

  1. )=theChar;
  2.         }
  3.     }
  4.     
  5.     oe=FSWrite(dataRefNum, &dataForkLength, dataForkPtr);
  6.     FSClose(dataRefNum);
  7.     FlushVol(0L, saveFile->vRefNum);
  8.     if (oe!=noErr)
  9.         return kCantWriteFile;
  10.     
  11.     theWindow=GetIndWindowRef(kMainWindow);
  12.     SetWTitle(theWindow, saveFile->name);
  13.     SetWindowTitle(theWindow, saveFile->name);
  14.     SetWindowFS(theWindow, *saveFile);
  15.     SetWindowIsModified(theWindow, FALSE);
  16.     
  17.     return allsWell;
  18. }
  19.  
  20. ErrorTypes GetTheFile(FSSpec *saveFile)
  21. {
  22.     short            oldRefNum, refNum, i, j, saveVersion;
  23.     Boolean            alreadyOpen;
  24.     Handle            resHandle;
  25.     MySaveRec        saveRec;
  26.     unsigned short    savedChecksum;
  27.     WindowRef        theWindow;
  28.     
  29.     if ((OpenTheResFile(saveFile, &oldRefNum, &refNum, &alreadyOpen, FALSE))!=noErr)
  30.         return kCantOpenFileToLoad;
  31.     
  32.     if ((resHandle=Get1Resource(kGameResType, kGameResID))==0L)
  33.     {
  34.         CloseTheResFile(oldRefNum, refNum, alreadyOpen);
  35.         return kCantLoadFile;
  36.     }
  37.     
  38.     Mymemcpy((Ptr)&saveVersion, (Ptr)*resHandle, sizeof(short));
  39.     if (saveVersion!=SAVE_VERSION)
  40.     {
  41.         ReleaseResource(resHandle);
  42.         CloseTheResFile(oldRefNum, refNum, alreadyOpen);
  43.         return kBadVersion;
  44.     }
  45.     
  46.     if (GetHandleSize(resHandle)!=sizeof(MySaveRec))
  47.     {
  48.         ReleaseResource(resHandle);
  49.         CloseTheResFile(oldRefNum, refNum, alreadyOpen);
  50.         return kBadChecksum;
  51.     }
  52.     
  53.     Mymemcpy((Ptr)&saveRec, (Ptr)*resHandle, sizeof(MySaveRec));
  54.     ReleaseResource(resHandle);
  55.     
  56.     savedChecksum=saveRec.checksum;
  57.     saveRec.checksum=0;
  58.     if (savedChecksum!=ComputeChecksum((Ptr)&saveRec, sizeof(MySaveRec)))
  59.     {
  60.         CloseTheResFile(oldRefNum, refNum, alreadyOpen);
  61.         return kBadChecksum;
  62.     }
  63.     
  64.     gNumRows=saveRec.numRows;
  65.     gNumCols=saveRec.numColumns;
  66.     gNumPlayed=saveRec.numPlayed;
  67.     gNumHilited=saveRec.numHighlighted;
  68.     gSelectedPieceColor=saveRec.selectedPieceColor;
  69.     for (i=0; i<12; i++)
  70.         gPiecesPlayed[i]=saveRec.piecesPlayed[i];
  71.     for (i=0; i<12; i++)
  72.         gPieceUsed[i]=saveRec.pieceUsed[i];
  73.     for (i=0; i<kBoardRowsMax; i++)
  74.         for (j=0; j<kBoardColumnsMax; j++)
  75.             gBoard[i][j]=saveRec.boardData[i][j];
  76.     
  77.     if ((theWindow=GetIndWindowRef(kMainWindow))!=0L)
  78.     {    /* may happen if gAskBeforeClosing is FALSE */
  79.         SetWindowIsModified(theWindow, FALSE);
  80.         CloseTheWindow(theWindow);
  81.     }
  82.     SetNewMainWindowTitle(saveFile->name);
  83.     gThisGameTileSize=gTileSize;
  84.     gCustomCursor=TRUE;
  85.     OpenTheIndWindow(kMainWindow, kAlwaysOpenNew);
  86.     if ((theWindow=GetIndWindowRef(kMainWindow))!=0L)
  87.         SetWindowFS(theWindow, *saveFile);
  88.     StartGame();    /* really only plays the sound or handles memory error */
  89.     
  90.     return allsWell;
  91. }
  92.  
  93. static    unsigned short ComputeChecksum(Ptr input, unsigned short len)
  94. {
  95.     unsigned short    i;
  96.     Boolean            shiftedOut;
  97.     unsigned short    checksum;
  98.     
  99.     checksum=0;
  100.     for (i=0; i<len; i++)
  101.     {
  102.         shiftedOut=(checksum&0x8000==0) ? FALSE : TRUE;
  103.         checksum+=*((unsigned char*)((long)input+i));
  104.         checksum<<=1;
  105.         if (shiftedOut)
  106.             checksum^=0xdead;
  107.     }
  108.     
  109.     return checksum;
  110. }
  111.